home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / utils / mac2max.c next >
C/C++ Source or Header  |  1979-12-31  |  2KB  |  133 lines

  1. /* --------------------------------- mac2max.c ------------------------------ */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Dump a macro file into text format. See 'max2mac'.
  8. */
  9.  
  10. #include "fly.h"
  11. #include "keyname.h"
  12.  
  13.  
  14. /* This is needed since "fly.h" defines it.
  15. */
  16. struct status    NEAR st = {0};
  17.  
  18. static int NEAR
  19. getshort (int *i, FILE *f)
  20. {
  21.     int    n;
  22.  
  23.     n = fgetc (f);
  24.     if (ferror (f) || feof (f))
  25.         return (0);
  26.     n = (n<<8) + fgetc (f);
  27.     if (ferror (f) || feof (f))
  28.         return (1);
  29.     *i = n;
  30.     return (2);
  31. }
  32.  
  33. static int NEAR
  34. keyname (int key)
  35. {
  36.     int    i;
  37.  
  38.     for (i = 0; k_name[i].name; ++i) {
  39.         if (k_name[i].value == key) {
  40.             printf ("%s", k_name[i].name);
  41.             return (1);
  42.         }
  43.     }
  44.     return (0);
  45. }
  46.  
  47. static int NEAR
  48. shiftname (int shift)
  49. {
  50.     int    i;
  51.  
  52.     for (i = 0; k_name[i].name; ++i) {
  53.         if (k_name[i].value && F(k_name[i].value & K_RAW)
  54.             && (k_name[i].value & shift) == k_name[i].value) {
  55.             printf ("%s", k_name[i].name);
  56.             return ((int)k_name[i].value);
  57.         }
  58.     }
  59.     return (0);
  60. }
  61.  
  62. static void NEAR
  63. putkey (int key)
  64. {
  65.     int    i, t;
  66.  
  67.     if (keyname (key))
  68.         return;
  69.  
  70.     for (i = key & K_SHIFTS; i && T(t = shiftname (i)); i ^= t)
  71.         printf (" ");
  72.     if (i)
  73.         printf ("SHX%02X ", ((Uint)i)>>8);    /* unknown shift */
  74.  
  75.     key &= K_RAW;
  76.     if (isprint (key))
  77.         printf ("%c", key);
  78.     else
  79.         printf ("\\%u", key);
  80. }
  81.  
  82. static void NEAR
  83. listmac (char    *mname)
  84. {
  85.     int    i, j, t, len;
  86.     FILE    *mac;
  87.  
  88.     mac = fopen (mname, RBMODE);
  89.     if (!mac) {
  90.         printf ("open '%s' failed", mname);
  91.         return;
  92.     }
  93.  
  94.     for (i = 0;; ++i) {
  95.         if (2 != getshort (&t, mac))
  96.             break;
  97.         if (2 != getshort (&len, mac)) {
  98.             printf ("read '%s' failed (1)", mname);
  99.             goto ret;
  100.         }
  101.         printf ("def ");
  102.         putkey (t);
  103.         printf ("\n");
  104.         for (j = 0; j < len; ++j) {
  105.             if (2 != getshort (&t, mac)) {
  106.                 printf ("read '%s' failed (2)", mname);
  107.                 goto ret;
  108.             }
  109.             printf ("    ");
  110.             putkey (t);
  111.             printf ("\n");
  112.         }
  113.     }
  114.     if (!feof (mac))
  115.         printf ("read '%s' failed (3)", mname);
  116. ret:
  117.     fclose (mac);
  118. }
  119.  
  120. int
  121. main (int argc, char *argv[])
  122. {
  123.     char    *mname;
  124.  
  125.     if (argc < 2 || !(mname = argv[1]))
  126.         mname = "fly.mac";
  127.  
  128.     listmac (mname);
  129.  
  130.     exit (0);
  131.     return (0);
  132. }
  133.